package com.imooc.dataobject;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.imooc.enums.ProductStatusEnum;
import com.imooc.utils.EnumUtil;
import lombok.*;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.GenericGenerators;

import javax.persistence.Entity;
import javax.persistence.Id;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

/**
 * 商品
 * Created by 廖师兄
 * 2017-05-09 11:30
 */
@Entity
@Data //生成getter,setter等函数
@DynamicInsert
@DynamicUpdate

//自动生成toString()方法，默认情况，按顺序（以“,”分隔）打印你的类名称以及每个字段。也可以设置不包含哪些字段/@ToString(exclude = {“id”,”name”})
//@ToString(exclude ={"",""})

// 无参数构造器
@NoArgsConstructor
//用于按照要求生成构造器，所谓的要求就是包含final字段和类似于@NonNull约束标注的字段，会对@NonNull字段进行明确的null检查
//@RequiredArgsConstructor
//用于生成包含所有字段的构造器。@NonNull字段会进行null判断检查。用于生成包含所有字段的构造器
@AllArgsConstructor(access = AccessLevel.PROTECTED, staticName = "test")
@Builder
//关于Builder较为复杂一些，Builder的作用之一是为了解决在某个类有很多构造函数的情况，也省去写很多构造函数的麻烦，在设计模式中的思想是：用一个内部类去实例化一个对象，避免一个类出现过多构造函数，
public class ProductInfo implements Serializable {
    
    private static final long serialVersionUID = 97524226934221772L;
    @Id
    private String productId;
    
    /** 名字. */
    private String productName;
    
    /** 单价. */
    private BigDecimal productPrice;
    
    /** 库存. */
    private Integer productStock;
    
    /** 描述. */
    private String productDescription;
    
    /** 小图. */
    private String productIcon;
    
    /** 状态, 0正常1下架. */
    private Integer productStatus = ProductStatusEnum.UP.getCode();
    
    /** 类目编号. */
    private Integer categoryType;
    
    private Date createTime;
    
    private Date updateTime;
    
    @JsonIgnore
    public ProductStatusEnum getProductStatusEnum() {
        return EnumUtil.getByCode(productStatus, ProductStatusEnum.class);
    }
    
    
    // 测试
    protected static ProductInfo test(String productId, String productName) {
    
        System.out.println("可以指定生成的构造器的访问权限。但是，但是如果指定了一个静态方法，那么构造器会自动会被private，只通过静态方法对外提供反问，并且我们发现final的属性值，是不会放进构造函数里面的。");
        return new ProductInfo();
    }
    
    
}

